package com.hczt.xhminiapp.common.redis;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.concurrent.TimeUnit;

/**
 * redis工具类
 * @author sundonghe
 *
 */
@Service
public class RedisService {

	@Autowired
	private RedisTemplate<String, Serializable> redisTemplate;

	/**
	 * 根据key值从缓存中获取数据
	 * @param prefix 前缀
	 * @param key key值
	 * @param clazz 返回值类型
	 * @return
	 */
	public <T> T get(KeyPrefix prefix, String key, Class<T> clazz) {
		Serializable value = redisTemplate.opsForValue().get(StringUtils.join(prefix.getPrefix(),key));
		if (value != null && value.getClass() == clazz) {
			return clazz.cast(value);
		}
		return null;
	}

	/**
	 * 保存数据
	 * @param prefix
	 * @param key
	 * @param value
	 * @param timeUnit
	 */
	public void set(KeyPrefix prefix,String key, Serializable value, TimeUnit timeUnit) {
    	// 超时时间
    	int expire = prefix.expire();

    	// 永不超时
    	if (expire <= 0) {
    		redisTemplate.opsForValue().set(StringUtils.join(prefix.getPrefix(),key), value);
    	// 设置超时时间
    	} else {
    		redisTemplate.opsForValue().set(StringUtils.join(prefix.getPrefix(),key), value, prefix.expire(), timeUnit);
    	}
    }

    public void set(KeyPrefix prefix, String key, Serializable value) {
        this.set(prefix, key, value, TimeUnit.MINUTES);
    }

    /**
     * 判断key值是否存在
     * @param prefix
     * @param key
     * @return
     */
    public boolean hasKey(KeyPrefix prefix, String key) {
    	return redisTemplate.hasKey(StringUtils.join(prefix.getPrefix(),key));
    }

    /**
     * 删除key
     */
    public void delete(KeyPrefix prefix, String key) {
    	redisTemplate.delete(StringUtils.join(prefix.getPrefix(), key));
    }

    /**
     * 自增
     * @param prefix
     * @param key
     * @return
     */
    public Long incr(KeyPrefix prefix, String key, long delta) {
    	return redisTemplate.opsForValue().increment(StringUtils.join(prefix.getPrefix(),key), delta);
    }
}